package com.jiutianniao.p2p.acctrans.core.account;

import com.jiutianniao.p2p.acctrans.core.exception.TransException;
import com.jiutianniao.p2p.base.model.Money;
import com.jiutianniao.p2p.trans.client.enums.FreezeBalanceTypeEnum;
import com.jiutianniao.p2p.trans.client.enums.RecordModelEnum;
import com.jiutianniao.p2p.trans.client.model.TransInfo;

/**
 * 账户包装接口
 * <p>
 * 实现以下几类操作:
 * <ul>
 * <li>记账类操作</li>
 * <li>管理类操作</li>
 * <li>预校验辅助</li>
 * <li>资金预处理</li>
 * <li>属性类操作</li>
 * </ul>
 * </p>
 */
public interface Account {

	// ---------------------- 记账类操作 ----------------------

	/**
	 * 借
	 * 
	 * @param transAmount
	 *            交易金额
	 * @param transInfo
	 *            交易信息
	 * @throws TransException
	 */
	void debit(Money transAmount, TransInfo transInfo) throws TransException;

	/**
	 * 贷
	 * 
	 * @param transAmount
	 *            交易金额
	 * @param transInfo
	 *            交易信息
	 * @throws TransException
	 */
	void credit(Money transAmount, TransInfo transInfo) throws TransException;

	// ---------------------- 管理类操作 ----------------------
	/**
	 * 冻结
	 * 
	 * @param freezeAmount
	 *            冻结金额
	 * @param freezeType
	 *            冻结类型
	 * @param transInfo
	 *            交易信息
	 * @return
	 * @throws TransException
	 */
	Long freeze(Money freezeAmount, FreezeBalanceTypeEnum freezeType,
			TransInfo transInfo) throws TransException;

	/**
	 * 解冻
	 * 
	 * @param unFreezeAmount
	 *            解冻金额
	 * @param freezeType
	 *            冻结类型
	 * @param transInfo
	 *            交易信息
	 */
	Long unFreeze(Money unFreezeAmount, FreezeBalanceTypeEnum freezeType,
			TransInfo transInfo) throws TransException;

	// ---------------------- 属性类操作 ----------------------

	/**
	 * 取得账号
	 * 
	 * @return String 账号
	 */
	String getAccountNo();

	/**
	 * 取得账户类型
	 * 
	 * @return int 账户类型
	 */
	int getAccountType();

	/**
	 * 取得对方账户
	 * 
	 * @return Account 对方账户
	 */
	Account getOtherAccount();

	/**
	 * 设置对方账户
	 * 
	 * @param 对方账户
	 */
	void setOtherAccount(Account otherAccount);

	/**
	 * 取得账户的科目
	 * 
	 * @return String 科目
	 */
	String getAccountTitle();

	/**
	 * 取得记账类型
	 */
	RecordModelEnum getRecordModel();

	/**
	 * 是否是资产类账户
	 */
	boolean isAsset() throws TransException;

	/**
	 * 是否资金增加
	 */
	boolean isAdd() throws TransException;

}
